import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 *
 * Class: Communicatie
 * Zorgt voor de Socket verbinding
 * @author frankkie
 */
public class Communicatie extends Thread {

  private static Communicatie instance;
  private Socket socket;
  private PrintWriter out;
  private BufferedReader in;
  private Spel spel;


  /**
   * Constructor Communicatie
   * Maakt een instantie van het Communicatie-Object
   * @param spel
   */
  public Communicatie(Spel spel) {
    System.out.println("Communicatie.Communicatie");
    this.spel = spel;
    instance = this;
  }


  /**
   *
   * Geeft de instantie van het Communicatie-Object
   * (Wordt gebruikt door Muur)
   * @return instance de instantie van het Communicatie-Object
   */
  public static Communicatie getInstance() {
    System.out.println("Communicatie.getInstance");
    return instance;
  }

  /**
   * Start als host
   * En wacht tot er een Client is verbonden.
   * Er wordt een ServerScoket geopend op poort 4444
   */
  public void startHost() {
    System.out.println("Communicatie.startHost");
    try {
      ServerSocket serverSocket = new ServerSocket(4444);
      //W8en op Client
      socket = serverSocket.accept();
      System.out.println("Verbonden :P");
      this.in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      this.out = new PrintWriter(socket.getOutputStream());
    } catch (Exception e) {
      System.out.println("[Communicatie.startHost()] Poort(4444) (waarschijnlijk) niet beschikbaar !!");
      e.printStackTrace();
    }
  }


  /**
   *
   * Start als Client
   * Maakt verbinding met een Host
   * Op Poort 4444, het ip adres wordt gevraagd aan de gebruiker.
   */
  public void startClient() {
    System.out.println("Communicatie.startClient");
    try {
      socket = new Socket(javax.swing.JOptionPane.showInputDialog("Vul het IP-adres van de Host in...","localhost"), 4444);
      System.out.println("Verbonden :P");
      this.in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      this.out = new PrintWriter(socket.getOutputStream());
    } catch (Exception e) {
      System.out.println("[Communicatie.startClient()] Kan Niet Verbinden met Host !!");
      e.printStackTrace();
      javax.swing.JOptionPane.showMessageDialog(null, "Kan Niet Verbinden met Host !!\nProgramma wordt gesloten.");
      System.exit(0);
    }
  }

  /**
   * Start de Thread
   * deze zorgt voor het ontvangen van de berichten
   * via de Socket verbinding
   */
  @Override
  public void run() {
    System.out.println("Communicatie.run");
    while (!socket.isClosed()) {
      try {
        //ontvangen
        String bericht = this.in.readLine();
        System.out.println("Ontvangen: " + bericht);
        if (bericht == null) {
          System.out.println("Verbinding wordt verbroken...");
          this.closeConnection();
        }
        //input verwerken
        spel.tegenstanderMuurGeklikt(bericht);
        //einde input verwerken
      } catch (Exception ex) {
        System.out.println("Fout..");
        ex.printStackTrace();
      }
    }
  }


  /**
   *
   * Stuur een bericht via de socket verbinding
   * @param commando het commando als een String
   */
  public void zendCommando(String commando) {
    System.out.println("Communicatie.zendCommando");
    out.println(commando);
    out.flush();
  }

  /**
   * Sluit de Socket verbinding
   */
  public void closeConnection() {
    System.out.println("Communicatie.closeConnection");
    try {
      socket.close();
      javax.swing.JOptionPane.showMessageDialog(null,"Verbinding is verbroken...\nProgramma wordt nu gesloten.");
      System.exit(0);
    } catch (Exception ex) {
      System.out.println("FOut...");
      ex.printStackTrace();
      System.exit(0);
    }
  }
}
